<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<title>OpenCV: XML/YAML Persistence</title>
<link href="../../opencv.ico" rel="shortcut icon" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="../../tutorial-utils.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
//<![CDATA[
MathJax.Hub.Config(
{
  TeX: {
      Macros: {
          matTT: [ "\\[ \\left|\\begin{array}{ccc} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{array}\\right| \\]", 9],
          fork: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ \\end{array} \\right.", 4],
          forkthree: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ \\end{array} \\right.", 6],
          forkfour: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ #7 & \\mbox{#8}\\\\ \\end{array} \\right.", 8],
          vecthree: ["\\begin{bmatrix} #1\\\\ #2\\\\ #3 \\end{bmatrix}", 3],
          vecthreethree: ["\\begin{bmatrix} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{bmatrix}", 9],
          cameramatrix: ["#1 = \\begin{bmatrix} f_x & 0 & c_x\\\\ 0 & f_y & c_y\\\\ 0 & 0 & 1 \\end{bmatrix}", 1],
          distcoeffs: ["(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \\tau_x, \\tau_y]]]]) \\text{ of 4, 5, 8, 12 or 14 elements}"],
          distcoeffsfisheye: ["(k_1, k_2, k_3, k_4)"],
          hdotsfor: ["\\dots", 1],
          mathbbm: ["\\mathbb{#1}", 1],
          bordermatrix: ["\\matrix{#1}", 1]
      }
  }
}
);
//]]>
</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<!--#include virtual="/google-search.html"-->
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="../../opencv-logo-small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">OpenCV
   &#160;<span id="projectnumber">4.5.2</span>
   </div>
   <div id="projectbrief">Open Source Computer Vision</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('../../',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#nested-classes">Classes</a>  </div>
  <div class="headertitle">
<div class="title">XML/YAML Persistence<div class="ingroups"><a class="el" href="../../d0/de1/group__core.html">Core functionality</a></div></div>  </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/dd9/classcv_1_1FileNode.html">cv::FileNode</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">File Storage <a class="el" href="../../d3/de3/classcv_1_1Node.html">Node</a> class.  <a href="../../de/dd9/classcv_1_1FileNode.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="../../d7/d4e/classcv_1_1FileNodeIterator.html">cv::FileNodeIterator</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">used to iterate through sequences and mappings.  <a href="../../d7/d4e/classcv_1_1FileNodeIterator.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d56/classcv_1_1FileStorage.html">cv::FileStorage</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">XML/YAML/JSON file storage class that encapsulates all the information necessary for writing or reading data to/from a file.  <a href="../../da/d56/classcv_1_1FileStorage.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<h1><a class="anchor" id="xml_storage"></a>
XML/YAML/JSON file storages.     </h1>
<h2>Writing to a file storage. </h2>
<p>You can store and then restore various OpenCV data structures to/from XML (<a href="http://www.w3c.org/XML">http://www.w3c.org/XML</a>), YAML (<a href="http://www.yaml.org">http://www.yaml.org</a>) or JSON (<a href="http://www.json.org/">http://www.json.org/</a>) formats. Also, it is possible to store and load arbitrarily complex data structures, which include OpenCV data structures, as well as primitive data types (integer and floating-point numbers and text strings) as their elements.</p>
<p>Use the following procedure to write something to XML, YAML or JSON:</p><ol type="1">
<li>Create new <a class="el" href="../../da/d56/classcv_1_1FileStorage.html" title="XML/YAML/JSON file storage class that encapsulates all the information necessary for writing or readi...">FileStorage</a> and open it for writing. It can be done with a single call to <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#a29bcb12ede10d87a0fcbf89a88b092af" title="The constructors. ">FileStorage::FileStorage</a> constructor that takes a filename, or you can use the default constructor and then call <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#a14c2c18dc2e29999d03d52a0c24bd91c" title="Opens a file. ">FileStorage::open</a>. Format of the file (XML, YAML or JSON) is determined from the filename extension (".xml", ".yml"/".yaml" and ".json", respectively)</li>
<li>Write all the data you want using the streaming operator <code>&lt;&lt;</code>, just like in the case of STL streams.</li>
<li>Close the file using <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#ad23d5415a06fb4bc97bfa034589b376e" title="Closes the file and releases all the memory buffers. ">FileStorage::release</a>. <a class="el" href="../../da/d56/classcv_1_1FileStorage.html" title="XML/YAML/JSON file storage class that encapsulates all the information necessary for writing or readi...">FileStorage</a> destructor also closes the file.</li>
</ol>
<p>Here is an example: </p><div class="fragment"><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d0/d9c/core_2include_2opencv2_2core_8hpp.html">opencv2/core.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &lt;time.h&gt;</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span><a class="code" href="../../d2/d75/namespacecv.html">cv</a>;</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span>, <span class="keywordtype">char</span>** argv)</div><div class="line">{</div><div class="line">    <a class="code" href="../../da/d56/classcv_1_1FileStorage.html">FileStorage</a> fs(<span class="stringliteral">&quot;test.yml&quot;</span>, <a class="code" href="../../da/d56/classcv_1_1FileStorage.html#a973e41cb75ef6230412a567723b7482da747a241cefee7b8af34c3d804c864ad6">FileStorage::WRITE</a>);</div><div class="line"></div><div class="line">    fs &lt;&lt; <span class="stringliteral">&quot;frameCount&quot;</span> &lt;&lt; 5;</div><div class="line">    time_t rawtime; time(&amp;rawtime);</div><div class="line">    fs &lt;&lt; <span class="stringliteral">&quot;calibrationDate&quot;</span> &lt;&lt; asctime(localtime(&amp;rawtime));</div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> cameraMatrix = (<a class="code" href="../../df/dfc/classcv_1_1Mat__.html">Mat_&lt;double&gt;</a>(3,3) &lt;&lt; 1000, 0, 320, 0, 1000, 240, 0, 0, 1);</div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> distCoeffs = (<a class="code" href="../../df/dfc/classcv_1_1Mat__.html">Mat_&lt;double&gt;</a>(5,1) &lt;&lt; 0.1, 0.01, -0.001, 0, 0);</div><div class="line">    fs &lt;&lt; <span class="stringliteral">&quot;cameraMatrix&quot;</span> &lt;&lt; cameraMatrix &lt;&lt; <span class="stringliteral">&quot;distCoeffs&quot;</span> &lt;&lt; distCoeffs;</div><div class="line">    fs &lt;&lt; <span class="stringliteral">&quot;features&quot;</span> &lt;&lt; <span class="stringliteral">&quot;[&quot;</span>;</div><div class="line">    <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i &lt; 3; i++ )</div><div class="line">    {</div><div class="line">        <span class="keywordtype">int</span> x = rand() % 640;</div><div class="line">        <span class="keywordtype">int</span> y = rand() % 480;</div><div class="line">        <a class="code" href="../../d1/d1b/group__core__hal__interface.html#ga65f85814a8290f9797005d3b28e7e5fc">uchar</a> lbp = rand() % 256;</div><div class="line"></div><div class="line">        fs &lt;&lt; <span class="stringliteral">&quot;{:&quot;</span> &lt;&lt; <span class="stringliteral">&quot;x&quot;</span> &lt;&lt; x &lt;&lt; <span class="stringliteral">&quot;y&quot;</span> &lt;&lt; y &lt;&lt; <span class="stringliteral">&quot;lbp&quot;</span> &lt;&lt; <span class="stringliteral">&quot;[:&quot;</span>;</div><div class="line">        <span class="keywordflow">for</span>( <span class="keywordtype">int</span> j = 0; j &lt; 8; j++ )</div><div class="line">            fs &lt;&lt; ((lbp &gt;&gt; j) &amp; 1);</div><div class="line">        fs &lt;&lt; <span class="stringliteral">&quot;]&quot;</span> &lt;&lt; <span class="stringliteral">&quot;}&quot;</span>;</div><div class="line">    }</div><div class="line">    fs &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line">    fs.<a class="code" href="../../da/d56/classcv_1_1FileStorage.html#ad23d5415a06fb4bc97bfa034589b376e">release</a>();</div><div class="line">    <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment --><p> The sample above stores to YML an integer, a text string (calibration date), 2 matrices, and a custom structure "feature", which includes feature coordinates and LBP (local binary pattern) value. Here is output of the sample: </p><div class="fragment"><div class="line">%YAML:1.0</div><div class="line">frameCount: 5</div><div class="line">calibrationDate: &quot;Fri Jun 17 14:09:29 2011\n&quot;</div><div class="line">cameraMatrix: !!opencv-matrix</div><div class="line">   rows: 3</div><div class="line">   cols: 3</div><div class="line">   dt: d</div><div class="line">   data: [ 1000., 0., 320., 0., 1000., 240., 0., 0., 1. ]</div><div class="line">distCoeffs: !!opencv-matrix</div><div class="line">   rows: 5</div><div class="line">   cols: 1</div><div class="line">   dt: d</div><div class="line">   data: [ 1.0000000000000001e-01, 1.0000000000000000e-02,</div><div class="line">       -1.0000000000000000e-03, 0., 0. ]</div><div class="line">features:</div><div class="line">   - { x:167, y:49, lbp:[ 1, 0, 0, 1, 1, 0, 1, 1 ] }</div><div class="line">   - { x:298, y:130, lbp:[ 0, 0, 0, 1, 0, 0, 1, 1 ] }</div><div class="line">   - { x:344, y:158, lbp:[ 1, 1, 0, 0, 0, 0, 1, 0 ] }</div></div><!-- fragment --><p>As an exercise, you can replace ".yml" with ".xml" or ".json" in the sample above and see, how the corresponding XML file will look like.</p>
<p>Several things can be noted by looking at the sample code and the output:</p>
<ul>
<li><p class="startli">The produced YAML (and XML/JSON) consists of heterogeneous collections that can be nested. There are 2 types of collections: named collections (mappings) and unnamed collections (sequences). In mappings each element has a name and is accessed by name. This is similar to structures and std::map in C/C++ and dictionaries in Python. In sequences elements do not have names, they are accessed by indices. This is similar to arrays and std::vector in C/C++ and lists, tuples in Python. "Heterogeneous" means that elements of each single collection can have different types.</p>
<p class="startli">Top-level collection in YAML/XML/JSON is a mapping. Each matrix is stored as a mapping, and the matrix elements are stored as a sequence. Then, there is a sequence of features, where each feature is represented a mapping, and lbp value in a nested sequence.</p>
</li>
<li>When you write to a mapping (a structure), you write element name followed by its value. When you write to a sequence, you simply write the elements one by one. OpenCV data structures (such as <a class="el" href="../../d3/d63/classcv_1_1Mat.html" title="n-dimensional dense array class ">cv::Mat</a>) are written in absolutely the same way as simple C data structures - using <code>&lt;&lt;</code> operator.</li>
<li>To write a mapping, you first write the special string <code>{</code> to the storage, then write the elements as pairs (<code>fs &lt;&lt; &lt;element_name&gt; &lt;&lt; &lt;element_value&gt;</code>) and then write the closing <code>}</code>.</li>
<li>To write a sequence, you first write the special string <code>[</code>, then write the elements, then write the closing <code>]</code>.</li>
<li>In YAML/JSON (but not XML), mappings and sequences can be written in a compact Python-like inline form. In the sample above matrix elements, as well as each feature, including its lbp value, is stored in such inline form. To store a mapping/sequence in a compact form, put <code>:</code> after the opening character, e.g. use <code>{:</code> instead of <code>{</code> and <code>[:</code> instead of <code>[</code>. When the data is written to XML, those extra <code>:</code> are ignored.</li>
</ul>
<h2>Reading data from a file storage. </h2>
<p>To read the previously written XML, YAML or JSON file, do the following:</p><ol type="1">
<li>Open the file storage using <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#a29bcb12ede10d87a0fcbf89a88b092af" title="The constructors. ">FileStorage::FileStorage</a> constructor or <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#a14c2c18dc2e29999d03d52a0c24bd91c" title="Opens a file. ">FileStorage::open</a> method. In the current implementation the whole file is parsed and the whole representation of file storage is built in memory as a hierarchy of file nodes (see <a class="el" href="../../de/dd9/classcv_1_1FileNode.html" title="File Storage Node class. ">FileNode</a>)</li>
<li>Read the data you are interested in. Use <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#adc7eff268ab95c664657a03e72ed85a5" title="Returns the specified element of the top-level mapping. ">FileStorage::operator []</a>, <a class="el" href="../../de/dd9/classcv_1_1FileNode.html#a544bdab727d3b76828c915b0fe30a8e6" title="Returns element of a mapping node or a sequence node. ">FileNode::operator []</a> and/or <a class="el" href="../../d7/d4e/classcv_1_1FileNodeIterator.html" title="used to iterate through sequences and mappings. ">FileNodeIterator</a>.</li>
<li>Close the storage using <a class="el" href="../../da/d56/classcv_1_1FileStorage.html#ad23d5415a06fb4bc97bfa034589b376e" title="Closes the file and releases all the memory buffers. ">FileStorage::release</a>.</li>
</ol>
<p>Here is how to read the file created by the code sample above: </p><div class="fragment"><div class="line">FileStorage fs2(<span class="stringliteral">&quot;test.yml&quot;</span>, <a class="code" href="../../da/d56/classcv_1_1FileStorage.html#a973e41cb75ef6230412a567723b7482daa0dcc459c4d100c35ccfa9a643827bed">FileStorage::READ</a>);</div><div class="line"></div><div class="line"><span class="comment">// first method: use (type) operator on FileNode.</span></div><div class="line"><span class="keywordtype">int</span> frameCount = (int)fs2[<span class="stringliteral">&quot;frameCount&quot;</span>];</div><div class="line"></div><div class="line"><a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> date;</div><div class="line"><span class="comment">// second method: use FileNode::operator &gt;&gt;</span></div><div class="line">fs2[<span class="stringliteral">&quot;calibrationDate&quot;</span>] &gt;&gt; date;</div><div class="line"></div><div class="line">Mat cameraMatrix2, distCoeffs2;</div><div class="line">fs2[<span class="stringliteral">&quot;cameraMatrix&quot;</span>] &gt;&gt; cameraMatrix2;</div><div class="line">fs2[<span class="stringliteral">&quot;distCoeffs&quot;</span>] &gt;&gt; distCoeffs2;</div><div class="line"></div><div class="line">cout &lt;&lt; <span class="stringliteral">&quot;frameCount: &quot;</span> &lt;&lt; frameCount &lt;&lt; endl</div><div class="line">     &lt;&lt; <span class="stringliteral">&quot;calibration date: &quot;</span> &lt;&lt; date &lt;&lt; endl</div><div class="line">     &lt;&lt; <span class="stringliteral">&quot;camera matrix: &quot;</span> &lt;&lt; cameraMatrix2 &lt;&lt; endl</div><div class="line">     &lt;&lt; <span class="stringliteral">&quot;distortion coeffs: &quot;</span> &lt;&lt; distCoeffs2 &lt;&lt; endl;</div><div class="line"></div><div class="line">FileNode features = fs2[<span class="stringliteral">&quot;features&quot;</span>];</div><div class="line">FileNodeIterator it = features.begin(), it_end = features.end();</div><div class="line"><span class="keywordtype">int</span> idx = 0;</div><div class="line">std::vector&lt;uchar&gt; lbpval;</div><div class="line"></div><div class="line"><span class="comment">// iterate through a sequence using FileNodeIterator</span></div><div class="line"><span class="keywordflow">for</span>( ; it != it_end; ++it, idx++ )</div><div class="line">{</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;feature #&quot;</span> &lt;&lt; idx &lt;&lt; <span class="stringliteral">&quot;: &quot;</span>;</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;x=&quot;</span> &lt;&lt; (int)(*it)[<span class="stringliteral">&quot;x&quot;</span>] &lt;&lt; <span class="stringliteral">&quot;, y=&quot;</span> &lt;&lt; (int)(*it)[<span class="stringliteral">&quot;y&quot;</span>] &lt;&lt; <span class="stringliteral">&quot;, lbp: (&quot;</span>;</div><div class="line">    <span class="comment">// you can also easily read numerical arrays using FileNode &gt;&gt; std::vector operator.</span></div><div class="line">    (*it)[<span class="stringliteral">&quot;lbp&quot;</span>] &gt;&gt; lbpval;</div><div class="line">    <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i &lt; (int)lbpval.size(); i++ )</div><div class="line">        cout &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; (<span class="keywordtype">int</span>)lbpval[i];</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;)&quot;</span> &lt;&lt; endl;</div><div class="line">}</div><div class="line">fs2.release();</div></div><!-- fragment --><h2><a class="anchor" id="format_spec"></a>
Format specification    </h2>
<p><code>([count]{u|c|w|s|i|f|d})</code>... where the characters correspond to fundamental C++ types:</p><ul>
<li><code>u</code> 8-bit unsigned number</li>
<li><code>c</code> 8-bit signed number</li>
<li><code>w</code> 16-bit unsigned number</li>
<li><code>s</code> 16-bit signed number</li>
<li><code>i</code> 32-bit signed number</li>
<li><code>f</code> single precision floating-point number</li>
<li><code>d</code> double precision floating-point number</li>
<li><code>r</code> pointer, 32 lower bits of which are written as a signed integer. The type can be used to store structures with links between the elements.</li>
</ul>
<p><code>count</code> is the optional counter of values of a given type. For example, <code>2if</code> means that each array element is a structure of 2 integers, followed by a single-precision floating-point number. The equivalent notations of the above specification are <code>iif</code>, <code>2i1f</code> and so forth. Other examples: <code>u</code> means that the array consists of bytes, and <code>2d</code> means the array consists of pairs of doubles.</p>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="../../d2/dfd/samples_2cpp_2filestorage_8cpp-example.html">samples/cpp/filestorage.cpp</a> </dd></dl>
</div><!-- contents -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 2 2021 11:36:40 for OpenCV by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
<script type="text/javascript">
//<![CDATA[
addTutorialsButtons();
//]]>
</script>
</body>
</html>
